/**
 * 文件名称：  PageSepeHelper.java
 * 文件版权:  China Gowin Technologies Co., Ltd. Copyright 2007-2012,All rights reserved
 * 文件描述:  <描述>
 * 修改作者:  LiXiangDong
 * 修改时间:  2012-10-26
 * 跟踪单号:  <跟踪单号>
 * 修改单号:  <修改单号>
 * 修改内容:  <修改内容>
 */
package com.parasol.hcerp.common.page;

import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.support.PagedListHolder;

/**
 * 分页工具类〈一句话功能简述〉 该工具类包含2部分： 1.封装action层分页操作.
 * 
 * @author LiXiangDong
 * @version V1.0, 2012-10-26
 */
public class PageSepeHelper
{
    public static final int PAGE_SIZE = 10;
    
    /**
     * Description: 测试是否需要重新生成分页信息 (验证firstload和first是否等于1) <br>
     * 1、重新生成分页信息 的一般含义为： <br>
     * 2、第一次进入页面，获取所有数据（无查询条件）<br>
     * 3、PageSize更改<br>
     * 4、…<br>
     * 
     * @param request
     * @return boolean
     * @exception/throws [违例类型] [违例说明]
     */
    public boolean isFirstLoad(HttpServletRequest request)
    {
        return "1".equals(request.getParameter("firstLoad"))
                || "2".equals(request.getParameter("firstLoad"))//增加从外部标签跳转的判断
                || "1".equals(request.getParameter("first"));
    }
    
    /**
     * Description: 获取分页类对象（用于数据库分页）<br>
     * 1、该函数内部已经封装了是否为FirstLoad的情况<br>
     * 2、…<br>
     * 3、…<br>
     * 4、…<br>
     * 
     * @param request
     *            ：请求对象
     * @param rowcount
     *            ：当前查询条件下的记录数
     * @return PageSeparate
     * @exception/throws [违例类型] [违例说明]
     */
    public PageSeparate setPageSeparateContentForDb(HttpServletRequest request,
            int rowcount)
    {
        PageSeparate pageSeparate = null;
        
        // 如果是第一次载入查询结果页面，则将全局属性PageSeparate置为空，重新生成一个分页类的对象
        String pageSize = request.getParameter("pageSize");
        
        if (pageSize == null || "".equals(pageSize.trim()))
        {
            pageSize = (String) request.getSession().getAttribute("pageSize");
            
            if (pageSize == null || "".equals(pageSize))
            {
                pageSize = String.valueOf(PAGE_SIZE);
            }
            
        }
        
        //是否生成分页类对象
        if (isFirstLoad(request))
        {
            //删除可能存在的其他页面的PageSeparate对象
            request.getSession().removeAttribute("PageSeparate");
            
            pageSeparate = new PageSeparate(rowcount,
                    Integer.parseInt(pageSize));
        }
        else
        {
            pageSeparate = (PageSeparate) request.getSession()
                    .getAttribute("PageSeparate"); // 使用已有的分页类
            // 重新计算记录条数，为了避免删除和添加记录后不能正确显示出来
            pageSeparate.setRowCount(rowcount);
            
            String command = request.getParameter("command"); // 得到从页面返回的参数，上一页还是下一页
            if ("next".equals(command))
            {
                pageSeparate.nextPage(); // 向后翻页
            }
            else if ("prev".equals(command))
            {
                pageSeparate.prevPage(); // 向前翻页
            }
            else if ("current".equals(command))
            {
                String curPage = request.getParameter("currentPage");
                pageSeparate.setNowPage(Integer.parseInt(curPage));
            }
        }
        
        request.getSession().setAttribute("pageSize", pageSize);
        
        request.setAttribute("currentPage",
                String.valueOf(pageSeparate.getNowPage()));
        
        request.setAttribute("pageListSize",
                String.valueOf(pageSeparate.getPageCount()));
        
        //4.将分页对象存入session
        request.getSession().setAttribute("PageSeparate", pageSeparate);
        
        return pageSeparate;
        
    }
    
    /**
     * Description: 内存分页中的分页操作<br>
     * 
     * @param recordlist
     *            ：需要在内存分页的数据 即所有数据的list
     * @param showlistname
     *            放request和session中前台用于展示的list的名字
     * @param request
     *            void
     * @exception/throws [违例类型] [违例说明]
     */
    public void setPageSeparateContentForRam(List<Object> recordlist,
            String showlistname, HttpServletRequest request)
    {
        if (isFirstLoad(request))
        {
            String pageSize = request.getParameter("pageSize");
            
            PagedListHolder pageList = new PagedListHolder(recordlist);
            
            if (pageSize == null || "".equals(pageSize.trim()))
            {
                pageSize = (String) request.getSession()
                        .getAttribute("pageSize");
                
                if (pageSize == null || "".equals(pageSize.trim()))
                {
                    pageList.setPageSize(PAGE_SIZE);
                }
                else
                {
                    pageList.setPageSize(Integer.parseInt(pageSize));
                }
            }
            else
            {
                pageList.setPageSize(Integer.parseInt(pageSize));
            }
            
            // 将数据放入session以备下次调用
            request.getSession().setAttribute(showlistname, pageList);
            
            // 将当前数据放入request，给页面循环
            request.setAttribute(showlistname, pageList);
            request.setAttribute("pageListSize",
                    String.valueOf(pageList.getPageCount()));
            request.getSession().setAttribute("pageSize",
                    String.valueOf(pageList.getPageSize()));
            request.setAttribute("currentPage",
                    String.valueOf(pageList.getPage() + 1));
        }
        else
        {
            PagedListHolder pageList = (PagedListHolder) request.getSession()
                    .getAttribute(showlistname);
            
            String pageSize = request.getParameter("pageSize");
            
            if (pageSize == null || "".equals(pageSize))
            {
                pageList.setPageSize(PAGE_SIZE);
            }
            else
            {
                pageList.setPageSize(Integer.parseInt(pageSize));
            }
            
            String page = request.getParameter("command");
            // page参数是从页面传来的控制翻页的参数
            if ("next".equals(page))
            {
                pageList.nextPage();
            }
            else if ("pre".equals(page))
            {
                pageList.previousPage();
            }
            else
            {
                pageList.setPage(Integer.parseInt(request.getParameter("currentPage")) - 1);
            }
            request.setAttribute(showlistname, pageList);
            request.setAttribute("pageListSize",
                    String.valueOf(pageList.getPageCount()));
            request.getSession().setAttribute("pageSize",
                    String.valueOf(pageList.getPageSize()));
            request.setAttribute("currentPage",
                    String.valueOf(pageList.getPage() + 1));
        }
    }
    
}
